效率工具 | 一款基于深度学习的代码自动补全神器
点击蓝字关注我
代码补全在开发过程中起着至关重要的作用,而随着深度学习的热潮,有开发者开始考虑把深度学习引入开发工具中,之前我介绍了一款基于人工智能的补全工具Kite,本文我来介绍另外一款基于深度学习的补全工具--TabNine,二者各有优缺点,我会在文中进行对比,各位可以根据需求自行选择。
—▼—
前言
代码补全对于大多数开发人员来说是至关重要的,它可以有效的提高开发效率、减少拼写错误和输入代码量。我们使用的大多数开发工具都自带补全功能,或者可以通过安装插件具备补全功能。但是,以往的代码补全功能主要基于语言本身的内置函数和上下文信息进行补全,而在候选项重要程度、代码块补全方面却不理想。与其说我们常用的自动补全工具的价值在补全方面,我更倾向于认为它的价值体现在提示。
近几年随着深度学习的抬头、火热,深度神经网络在学术领域有着很多最为先进的算法,并且在很多商业领域都得到应用。因此,有想法的研究者也尝试把深度学习引入开发工具中。
在之前的一篇文章中,我介绍了一款人工智能自动补全工具Kite,它在自动补全效率、文档阅读等方面的确要优于绝大多数自动补全工具,而且配置简单。本文将介绍另外一款基于深度学习的自动补全工具--TabNine,虽然同是基于人工智能的开发工具,但是它们却有各自的侧重点。下面我就先介绍一下Kite与TabNine的区别,然后详细介绍一下TabNine的特点,各位根据自己的偏好选择其中一款进行配置。
Kite与TabNine
Kite与TabNine都是优秀的、基于人工智能的代码自动补全工具,相对于大多数自动补全插件,它都能让人感到非常惊艳,但是二者都有各自的侧重点,下面就来说一下Kite与TabNine各自的优点和缺点。
Kite
Kite更加倚重于预先存在的知识库,它是在预先存在的知识库上进行学习得到的补全经验,因此,不需要在开发过程中训练和学习,因此,它具备如下优点:
补全速度快
代码块补全功能强大
简洁强大的文档阅读功能
以代码块补全功能强大为例,来说一下Kite的特点,对于大多数补全工具,包括TabNine在内,主要是补全接下来要输入的字符串,而Kite不仅可以补全字符串,还可以补全代码库。举个例子,我们要导入numpy
模块,对于大多数补全工具,我们输入numpy
的几个字母后,它会联想出完整的numpy
,但是对于Kite,当输入import num
,它会根据知识库中大多数使用者的习惯直接补全import numpy as np
。同样,当我们导入matplotlib
中pyplot
时,当我们输入from matplotlib
,它会补全from matplotlib import pyplot as plt
,这样显然更加高效,节省代码量。
没有哪个工具是完美无暇的,Kite也有缺点,我认为Kite是非常优秀的,甚至Python之父都对它赞不绝口,但是它也有3个缺点让我有点无法忍受,
方案偏“重”
支持语言单一
占用资源
首先说一下第一点,方案偏“重”。
对于大多数补全工具,它们只是一个插件,比较轻量化,而Kite相对较重,需要预先下载、安装一个200M+的软件,除了在电脑上安装Kite之外,还需要在对应的编辑器/IDE安全Kite的插件,另外,每次使用Kite自动补全之前需要把Kite打开。所以,这一系列的配置、使用过程相对较“重”。
其次说一下支持语言单一,Kite定位是一款Python自动补全工具,因此在很多特色方面都是针对Python进行优化,因此,支持语言相对单一。
最后,说一下占用资源,虽然Kite内存占用情况远远比不上Pycharm、IDEA这些臃肿的开发工具,但是在win10下也要占用将近400M的内存资源,对于大多数工具相对较高,如果电脑配置偏低,打开Kite会使得系统较为卡顿。
TabNine
和Kite不同,首先,TabNine是基于开发者过去的使用习惯进行补全,而不是预先的知识库,因此,当项目较小或者正在向其中添加新库时,它的效果不如Kite。当然,这是二者思想上的差异,TabNine之所以成功,自然有它的优点,
轻量化
配置简单
支持语言丰富
能够给出补全项的概率和地址
以给出补全项的概率和地址为例来说明一下TabNine的优点,TabNine在自动补全时会给出每个候选项的概率,并且按照概率大小进行排序,此外,会给出候选项的来源及地址,这样更加方便查询和阅读。
另外,Kite在语言支持方面更加具有针对性,主要针对Python的自动补全,而TabNine支持的编程语言更加丰富,而不是针对某一特定语言。
TabNine的缺点也非常明显,
补全速度慢
依赖语言服务
首先说一下补全速度慢,TabNine在使用过程中需要大量的计算资源进行学习,因此它会带来高延迟。因此TabNine在专业版和企业版中提供了TabNine Cloud服务,提供GPU计算资源,当然,这都是需要付费的。
其次说一下依赖语言引擎,TabNine默认情况是关闭语义补全的,如果要开启语义补全需要安装不同编程语言对应的服务,例如Python需要安装python-language-server
,每一种编程语言都需要配置对应的服务,可以选择繁琐的手动配置,针对这一点TabNine也提供了较好的解决方案,在编辑器中输入TabNine::sem
,它会自动开启语义补全在开启过程中会按照对应语言的服务。
TabNine
前面概括性的介绍了一下TabNine与Kite各自的优缺点,这里我就详细的介绍一下TabNine强大之处与原理。
优势
前面已经简单的介绍了TabNine的优点,
轻量化
配置简单
支持语言丰富
能够给出补全项的概率和地址
这些非量化的评价指标不够直观,从另外一个可量化的指标来说一下TabNine的强大之处,
支持22种编程语言
支持7类编辑器
支持的编程语言
TabNine支持Python, JavaScript, Java, C++, C, PHP, Go, C#, Ruby, Objective-C, Rust, Swift, TypeScript, Haskell, OCaml, Scala, Kotlin, Perl, SQL, HTML, CSS和Bash这22种编程语言。
Python
Java
C++
支持的编辑器
首先要注意,我前面所说的是7类编辑器,而不是7款,它支持vs code、IntelliJ、Sublime、Vim、Emacs、Atom、Jupyter Notebook共7类编辑器。
其中IntelliJ是一个系列,其中包括IDEA、Pycharm、Android Studio等。
Vim包括Vim(Deopleto)、Vim(Coc)。
原理
TabNine是基于OpenAI的GPT-2模型,在GitHub上200万个文件上进行训练得出,它的训练目标是通过之前给出的标记预测接下来的标记(token),为了实现这个目标,它学习了复杂的行为,例如动态类型语言的推断。
然后说一下GPT-2模型,它是一个在自然语言领域名气不亚于BERT的网络模型,它使用了Transformer网络作为基础,这个模型最初是用于解决自然语言处理问题(NLP),尽管纯粹的自然语言和代码补全有很多不同之处,但是自然语言和代码补全在语义上还是有一些可借鉴的地方,例如对于英语的理解。TabNine就利用这一点用于代码补全中函数名、参数、返回类型等方面的推断。
TabNine配置
TabNine配置相对于Kite较为简单,只需要在简单的几步即可以完成。需要再重复一遍的是,TabNine默认是不开启语言补全的,如果要开启语义补全需要安装配置对应语言的服务、引擎,当然,这对于TabNine也很简单,只需要在编辑器输入TabNine::sem
即可,TabNine支持vs code、IntelliJ、Sublime、Vim、Emacs、Atom、Jupyter Notebook共7类编辑器,我在这里就挑选几个使用较多的编辑器/IDE讲解一下。
vs code
方式一:手动安装
打开vs code
点击插件管理
搜索tabnine
点击安装
这种方式比较简洁明了,首推这一种方法。
方式2:命令安装
打开vs code
快捷键
Ctrl+P
输入
ext install TabNine.tabnine-vscode
确认
IntelliJ Platform
打开设置
找到
Plugins
在marketplace搜索TabNine安装
Sublime Text
快捷键
Ctrl+Shift+P
输入
Install Package
选择
Package Control:Install Package
搜索
TabNine
确认
Vim
方式一:Vundle
首选需要配置插件管理器Vundle
在
.vimrc
中添加Plugin 'zxqfl/tabnine-vim'
随便打开一个vim,输入
:PluginInstall
方式二:Git
克隆项目
git clone --depth 1 https://github.com/zxqfl/tabnine-vim
把
set rtp+=~/tabnine-vim
添加到.vimrc
(~/tabnine-vim是克隆到本地的路径,需要根据自己的路径修改)
TabNine命令配置
就如同前面提到的,如果没有开启语义补全,需要在编辑器中输入命令开启语义补全,TabNine支持一些命令配置方式,主要有如下几个,
TabNine::sem
开启语义补全TabNine::no_sem
关闭语义补全TabNine::config
打开配置页面TabNine::version
查看版本信息
▲
END
长按扫码可关注